﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using itau.im.entidade;
using EnterpriseLibraryWrapper;
using System.Collections;
using System.Data;

namespace itau.im.negocio
{
    [ServiceContract]
    public interface IExecucaoCurvaBS
    {
        #region Métodos

        IList<CurvaVigente> ObterUltimaExecucaoCurvasDataReferencia(IList<Curva> listaCurvas, DateTime dataReferencia, string procedure);
                
        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurva(DateTime dataHoraFim, int codigoSituacaoInicio, int codigoSituacaoFim);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaExecucaoPonto> ObterPontosCurvaDataReferencia(int codigoCurva, DateTime dataReferencia);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        DataSet ObterCurvaExecucaoPontosDataSet(int curvaID, DateTime dataInclusaoVigencia, DateTime dataHoraExecucaoCurva, DateTime dataLimite, int codigoTipoTaxa, int codigoTipoBase);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurvaLikeNome(DateTime dataInicio, DateTime dataFim, int codigoTipoCurva, int codigoModalidade, string nomeCurva, int codigoSituacao, int codigoMoeda, int codigoTipoEntradaDado, int codigoSubMesa, int codigoCategoriaMercado);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurvaTransferPrice(DateTime dataHoraFim, int codigoSituacaoInicio, int codigoSituacaoFim);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurvaPricingBIHF(DateTime dataHoraFim, int codigoSituacaoInicio, int codigoSituacaoFim);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<AnaliseCurvaRetida> ObterListaAnaliseCurvaRetidaPaginada(CurvaVigente curvaVigente, int situacaoExecucaoAtual, int pagina);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaExecucaoPonto> ObterCurvaExecucaoPontosPaginada(int curvaID, DateTime dataInclusaoVigencia, DateTime dataHoraExecucaoCurva, int pagina);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaVigente> ObterUltimaExecucaoCurvasDataReferencia(IList<Curva> listaCurvas, DateTime dataReferencia);

        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurva(int codigoCurva, DateTime dataHoraExecucao, int codigoSituacao);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void AtualizarCurvaExecucaoPontos(IList<CurvaExecucaoPonto> vertices);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void AtualizarRegistroExecucaoCurva(RegistroExecucaoCurva registroExecucaoCurva);

        RegistroExecucaoCurva ObterRegistroExecucaoCurva(int codigoCurva, DateTime dataInclusao, DateTime dataReferencia, int codigoSituacao);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaExecucaoPonto> ObterVerticesCurvaVigente(int curvaID, DateTime dataInclusaoVigencia, DateTime dataHoraExecucaoCurva);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaVigente> ObterUltimaExecucaoCurvas(IList<CurvaVigente> listaCurvasVigente);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        RegistroExecucaoCurva ObterUltimaExecucaoCurva(int curvaID, DateTime dataInclusaoVigencia, DateTime dataReferencia, int codigoSituacao);
        
        RegistroExecucaoCurva ObterRegistroExecucaoCurva(int curvaID, DateTime dataInclusaoVigencia);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroExecucaoCurva> ObterRegistrosExecucaoCurvaPorCurvaVigente(int curvaVigenteID);
       
        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarRegistroExecucaoCurva(RegistroExecucaoCurva registroExecucaoCurva);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarCurvaExecucaoPontos(IList<CurvaExecucaoPonto> vertices);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void PersistirExecucao(IList<CurvaExecucaoPonto> vertices, RegistroExecucaoCurva registroExecucao);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarOuAtualizarCurvaExecucaoPontos(IList<CurvaExecucaoPonto> vertices);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarCurvaExecucaoPontosPorImportacao(IList<CurvaExecucaoPonto> vertices, DateTime dataExtensao);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterCurvasRetidasPorTipoMesaCategoria(int tipoCurvaID, int subMesaID, int categoriaMercadoID);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterCurvasPorTipoMesaCategoriaSituacao(int tipoCurvaID, int subMesaID, int categoriaMercadoID, int codigoSituacao);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterCurvasPorTipoMesaCategoriaSituacaoData(int tipoCurvaID, int subMesaID, int categoriaMercadoID, int codigoSituacao, DateTime dataReferencia);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterLiberacoesPorCurvaSituacaoPeriodo(int curvaID, int codigoSituacao, DateTime dataInicio, DateTime dataFim);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterCurvasParaLiberacaoRejeicaoConsulta(int codigoTipoCurva, int codigoSubMesa, int codigoCategoriaMercado, int codigoModalidade, int codigoSituacao, int codigoMoeda, int codigoTipoEntradaDado, string nomeCurva, DateTime dataHoraInicio, DateTime dataHoraFim);

        bool ValidarCurvaExecucao(Curva curva, RegistroExecucaoCurva registroExecucaoCurva);

        bool ValidarCurvaNoTunel(IList<AnaliseCurvaRetida> listaCurvaRetida);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<AnaliseCurvaRetida> ObterListaAnaliseCurvaRetida(CurvaVigente curvaVigente, int situacaoExecucaoAtual);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void AgendarGeracaoCurvasCompostas(int codigoCurvaComponente);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarAgendamentoDasCurvasAtivas(DateTime dataHoraAtual, int codigoSituacao, int codigoTipoEventoNotificacao, DateTime dataHoraLiberacaoCurva);
        
        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<CurvaExecucaoPonto> ObterCurvaExecucaoPontos(int curvaID, DateTime dataInclusaoVigencia, DateTime dataHoraExecucaoCurva);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void RemoverCurvaExecucaoPontos(RegistroExecucaoCurva registroExecucaoCurva);

        void RemoverCurvaExecucaoPontos(RegistroExecucaoCurva registroExecucaoCurva, int indicadorVertice);

        void RemoverCurvaExecucaoPontos(RegistroExecucaoCurva registroExecucaoCurva, List<string> procedures);

        void RemoverCurvaExecucaoPontos(RegistroExecucaoCurva registroExecucaoCurva, int indicadorVertice, List<string> procedures);

        IList<CurvaExecucaoPonto> Somar(IList<CurvaExecucaoPonto> pontosCurvaA, IList<CurvaExecucaoPonto> pontosCurvaB, string operadorCurvaA, string operadorCurvaB);

        IList<CurvaExecucaoPonto> Subtrair(IList<CurvaExecucaoPonto> pontosCurvaA, IList<CurvaExecucaoPonto> pontosCurvaB, string operadorCurvaA, string operadorCurvaB);

        IList<CurvaExecucaoPonto> Potencia(IList<CurvaExecucaoPonto> pontosCurvaA, IList<CurvaExecucaoPonto> pontosCurvaB, string operadorCurvaA, string operadorCurvaB);

        IList<CurvaExecucaoPonto> Multiplicar(IList<CurvaExecucaoPonto> pontosCurvaA, IList<CurvaExecucaoPonto> pontosCurvaB, string operadorCurvaA, string operadorCurvaB);

        IList<CurvaExecucaoPonto> Dividir(IList<CurvaExecucaoPonto> pontosCurvaA, IList<CurvaExecucaoPonto> pontosCurvaB, string operadorCurvaA, string operadorCurvaB);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        RegistroExecucaoCurva ObterRegistroExecucaoCurva(int curvaID, DateTime dataInclusaoVigencia, DateTime dataHoraExecucaoCurva);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterExecucaoCurvasFuturasPorDataReferencia(int codigoTipoCurva, int codigoModalidade, int codigoSubMesa, int codigoCategoriaMercado, int codigoMoeda, int codigoTipoEntradaDado, string nomeCurva, DateTime dataReferencia);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<LiberacaoCurva> ObterExecucaoCurvasFuturasPorTipoMesaCategoriaData(int tipoCurvaID, int subMesaID, int categoriaMercadoID, DateTime dataReferencia);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        void CriarCurvaExecucaoPorImportacao(ImportacaoArquivo importArquivo, RegistroExecucaoCurva registroExecucaoCurva);

        void AlterarExecucaoRemoverPontos(RegistroExecucaoCurva registro);

        void AlterarExecucaoRemoverPontos(RegistroExecucaoCurva registro, List<string> procedures);

        void ValidarLiberacaoCurva(RegistroExecucaoCurva registroExecucaoCurva, Curva curva, bool valido);

        void AtualizarSituacaoRegistrosExecucaoCurva(int codigoCurva, DateTime dataExecucao, int codigoSituacaoAtual, int codigoSituacaoNova);

        void CriarCurvaExecucaoPontos(IList<CurvaExecucaoPonto> vertices, string nomeProcedure);

        [OperationContract]
        [FaultContract(typeof(WCFFaultContract))]
        IList<RegistroGradeExecucaoCurva> ObterGradeExecucaoCurva();

        #endregion

    }
}
